package com.tang.model.clone;

/**
 * @Author sisyphus
 * @DATE 2022/4/27 7:20
 * @Desc
 * @Remarks
 */
public class CloneTest implements Cloneable {
    byte[] a = new byte[]{1, 2, 3, 4};
    byte[] b = new byte[]{5, 6, 7, 8};

    @Override
    protected CloneTest clone() throws CloneNotSupportedException {
        CloneTest copy = (CloneTest) super.clone();
        /**
         * 只将a对象进行 clone拷贝 和 b对象进行区分
         */
        copy.a = this.a.clone();
        return copy;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        CloneTest origin = new CloneTest();
        CloneTest clone = origin.clone();
        System.out.println("origin地址：" + origin);
        System.out.println("clone地址：" + clone);

        System.out.println("\n========参数a做测试");
        System.out.println("clone对象a[2]的值：" + clone.a[2]);
        System.out.println("origin修改a[2]的值，从3改为5");
        origin.a[2] = 5;
        System.out.println("修改后clone对象a[2]的值：" + clone.a[2]);

        System.out.println("\n========参数b做测试");
        System.out.println("clone对象b[2]的值：" + clone.b[2]);
        System.out.println("origin修改b[2]的值，从7改为10");
        origin.b[2] = 10;
        System.out.println("修改后clone对象b[2]的值：" + clone.b[2]);

        /**
         * 结论：
         * clone 只是会进行一些简单的对象的拷贝 比如 8个基本数据类型（String 这种数据类型很特殊 -》 常量池）
         * 若要实现深层次的拷贝，还需在clone方法中实现去分别拷贝对象类型的参数
         */

    }

}
